home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / lib / memory / movmem.a < prev    next >
Text File  |  1994-02-01  |  3KB  |  133 lines

  1.  
  2.         ;   MOVMEM.A
  3.         ;
  4.         ;   (c)Copyright 1990, Matthew Dillon, All Rights Reserved
  5.  
  6.         section text,code
  7.  
  8.         ;   movmem(src, dst, len)   (ANSI)
  9.         ;   bcopy(src, dst, len)    (UNIX)
  10.         ;        A0    A1   D0     DICE-REG
  11.         ;        A0    A1   D0     internal
  12.         ;     4(sp) 8(sp) 12(sp)
  13.         ;
  14.         ;   The memory move algorithm is somewhat more of a mess
  15.         ;   since we must do it either ascending or decending.
  16.  
  17.         xdef    _movmem
  18.         xdef    _hyper_movmem
  19.         xdef    _bcopy        ; UNIX
  20.         xdef    _hyper_bcopy    ; UNIX
  21.         xdef    @movmem
  22.         xdef    @bcopy        ; UNIX
  23.  
  24.  
  25. _hyper_bcopy:
  26. _hyper_movmem:
  27. _bcopy:
  28. _movmem:    move.l    4(sp),A0
  29.         move.l    8(sp),A1
  30.         move.l    12(sp),D0
  31. @bcopy:
  32. @movmem:
  33.         move.l    A1,-(sp)        ; save return value
  34.         cmp.l    A0,A1        ;move to self
  35.         beq    xbmend
  36.         bls    xbmup
  37. xbmdown     adda.l    D0,A0        ;descending copy
  38.         adda.l    D0,A1
  39.         move.w    A0,D1        ;CHECK WORD ALIGNED
  40.         lsr.l    #1,D1
  41.         bcs    xbmdown1
  42.         move.w    A1,D1
  43.         lsr.l    #1,D1
  44.         bcs    xbmdown1
  45.         cmp.l    #259,D0         ;chosen by calculation.
  46.         bcs    xbmdown8
  47.  
  48.         move.l    D0,D1            ;overhead for bmd44: ~360
  49.         divu    #44,D1
  50.         bvs    xbmdown8        ;too big (> 2,883,540)
  51.         movem.l D2-D7/A2-A6,-(sp)   ;use D2-D7/A2-A6 (11 regs)
  52.         move.l    #44,D0
  53.         bra    xbmd44b
  54. xbmd44a     sub.l    D0,A0            ;8        total 214/44bytes
  55.         movem.l (A0),D2-D7/A2-A6    ;12 + 8*11  4.86 cycles/byte
  56.         movem.l D2-D7/A2-A6,-(A1)   ; 8 + 8*11
  57. xbmd44b     dbf    D1,xbmd44a        ;10
  58.         swap    D1            ;D0<15:7> already contain 0
  59.         move.w    D1,D0            ;D0 = remainder
  60.         movem.l (sp)+,D2-D7/A2-A6
  61.  
  62. xbmdown8    move.w    D0,D1            ;D1<2:0> = #bytes left later
  63.         lsr.l    #3,D0            ;divide by 8
  64.         bra    xbmd8b
  65. xbmd8a        move.l    -(A0),-(A1)         ;20         total 50/8bytes
  66.         move.l    -(A0),-(A1)         ;20         = 6.25 cycles/byte
  67. xbmd8b        dbf    D0,xbmd8a        ;10
  68.         sub.l    #$10000,D0
  69.         bcc    xbmd8a
  70.         move.w    D1,D0            ;D0 = 0 to 7 bytes
  71.         and.l    #7,D0
  72.         bne    xbmdown1
  73. xbmend
  74.         move.l    (sp)+,D0
  75.         rts
  76.  
  77. xbmd1a        move.b    -(A0),-(A1)         ;12         total 22/byte
  78. xbmdown1                    ;        = 22 cycles/byte
  79. xbmd1b        dbf    D0,xbmd1a        ;10
  80.         sub.l    #$10000,D0
  81.         bcc    xbmd1a
  82.         move.l    (sp)+,D0
  83.         rts
  84.  
  85. xbmup        move.w    A0,D1            ;CHECK WORD ALIGNED
  86.         lsr.l    #1,D1
  87.         bcs    xbmup1
  88.         move.w    A1,D1
  89.         lsr.l    #1,D1
  90.         bcs    xbmup1
  91.         cmp.l    #259,D0         ;chosen by calculation
  92.         bcs    xbmup8
  93.  
  94.         move.l    D0,D1            ;overhead for bmu44: ~360
  95.         divu    #44,D1
  96.         bvs    xbmup8            ;too big (> 2,883,540)
  97.         movem.l D2-D7/A2-A6,-(sp)   ;use D2-D7/A2-A6 (11 regs)
  98.         move.l    #44,D0
  99.         bra    xbmu44b
  100. xbmu44a     movem.l (A0)+,D2-D7/A2-A6   ;12 + 8*11  ttl 214/44bytes
  101.         movem.l D2-D7/A2-A6,(A1)    ;8  + 8*11  4.86 cycles/byte
  102.         add.l    D0,A1            ;8
  103. xbmu44b     dbf    D1,xbmu44a        ;10
  104.         swap    D1            ;D0<15:7> already contain 0
  105.         move.w    D1,D0            ;D0 = remainder
  106.         movem.l (sp)+,D2-D7/A2-A6
  107.  
  108. xbmup8        move.w    D0,D1            ;D1<2:0> = #bytes left later
  109.         lsr.l    #3,D0            ;divide by 8
  110.         bra    xbmu8b
  111. xbmu8a        move.l    (A0)+,(A1)+         ;20         total 50/8bytes
  112.         move.l    (A0)+,(A1)+         ;20         = 6.25 cycles/byte
  113. xbmu8b        dbf    D0,xbmu8a        ;10
  114.         sub.l    #$10000,D0
  115.         bcc    xbmu8a
  116.         move.w    D1,D0            ;D0 = 0 to 7 bytes
  117.         and.l    #7,D0
  118.         bne    xbmup1
  119.         move.l    (sp)+,D0
  120.         rts
  121.  
  122. xbmu1a        move.b    (A0)+,(A1)+
  123. xbmup1
  124. xbmu1b        dbf    D0,xbmu1a
  125.         sub.l    #$10000,D0
  126.         bcc    xbmu1a
  127.         move.l    (sp)+,D0
  128.         rts
  129.  
  130.         END
  131.  
  132.  
  133.